#ifndef CJSON_CREATE_H
#define CJSON_CREATE_H

#include "ljsonc_type.h"

#include <stdio.h>
#include <errno.h>

#ifdef __cplusplus
extern "C" {
#endif

ljsonc_value *create_value();
ljsonc_element *create_element();
ljsonc_element *create_element_v(const char *kry, ljsonc_value *value);
ljsonc_json *create_json();
ljsonc_array *create_array();
CString create_string(const char *c_str);

ljsonc_value *clone_value(ljsonc_value *value);
ljsonc_element *clone_element(ljsonc_element *elem);
ljsonc_json *clone_json(ljsonc_json *json);
ljsonc_array *clone_array(ljsonc_array *array);
CString clone_string(const char *c_str);

ljsonc_value *create_value_int(int n);
ljsonc_value *create_value_double(double dn);
ljsonc_value *create_value_string(const char *c_str);
ljsonc_value *create_value_json(ljsonc_json *json);
ljsonc_value *create_value_array(ljsonc_array *array);

void destory_value(ljsonc_value *value);
void destory_element(ljsonc_element *elem);
void destory_json(ljsonc_json *json);
void destory_array(ljsonc_array *array);
void destory_string(CString str);

void set_value_int(ljsonc_value *value, int n);
void set_value_double(ljsonc_value *value, double dn);
void set_value_string(ljsonc_value *value, const char *c_str);
void set_value_json(ljsonc_value *value, ljsonc_json *json);
void set_value_array(ljsonc_value *value, ljsonc_array *array);

void set_element_key(ljsonc_element *elem, const char *c_str);
void set_element_value(ljsonc_element *elem, ljsonc_value *value);
void set_element(ljsonc_element *elem, const char *c_str, ljsonc_value *value);

void set_element_int(ljsonc_element *value, int n);
void set_element_double(ljsonc_element *value, double dn);
void set_element_string(ljsonc_element *value, const char *c_str);
void set_element_json(ljsonc_element *value, ljsonc_json *json);
void set_element_array(ljsonc_element *value, ljsonc_array *array);

bool json_append(ljsonc_json *json, ljsonc_element *elem);
bool array_append(ljsonc_array *array, ljsonc_value *value);

CString get_json_value(ljsonc_json *json);
bool save_json(FILE *fp, ljsonc_json *json);

#ifdef __cplusplus
}
#endif

#endif